16. Gli Oggetti e i Membri statici

Prima di introdurre il concetto dei membri statici, è necessario sapere che per utilizzare un membro di una classe, un attributo o un metodo, è obbligatorio creare un'istanza di tale classe attraverso la parola chiave new, come illustrato nel capitolo precedente.

$utente = new Persona("John", "Doe", "1-1-1970");

In questo modo, ogni istanza della classe avrà la propria copia di ogni attributo e ogni metodo.

Talvolta può risultare utile voler rendere accessibile un membro di una classe senza doverne inizializzare un'istanza, e questo è appunto possibile dichiarando il membro come statico.

Per capire meglio, prendiamo un esame un'ipotetica classe "Colore", che avrà una serie di colori di base che sarà utile rendere accessibili sempre, anche quando effettivamente non ci sarà utile creare un'istanza della suddetta classe.

Colore.php

<?php

	class Colore
	{
		static $rosso = "#FF0000";
		static $verde = "#00FF00";
		static $blu = "#0000FF";

		/*
			... altri attributi
		*/

		public function Colore()
		{ /* codice costruttore */ }

		/*
			... altri metodi
		*/

		static public function stampaColore($colore)
		{
			echo "<font color=\"" . Colore::${$colore} . "\">Il valore esadecimale del colore $colore è : ";
			echo Colore::${$colore} . "</font><br />\n";
		}
	}

?>

Ora che abbiamo dichiarato la nostra nuova classe Colore, vediamo come è possibile utilizzare i suoi 3 attributi statici.
E' sufficiente specificare il nome della classe seguito dai doppi due punti e il nome del membro :

test.php

<?php

	require_once("Colore.php");

	echo "<font color=\"" . Colore::$rosso . "\">Il valore esadecimale del colore rosso è : ";
	echo Colore::$rosso . "</font><br />\n";

	echo "<font color=\"" . Colore::$verde . "\">Il valore esadecimale del colore verde è : ";
	echo Colore::$verde . "</font><br />\n";

	echo "<font color=\"" . Colore::$blu . "\">Il valore esadecimale del colore blu è : ";
	echo Colore::$blu . "</font><br />\n";

?>

Richiamando la pagina test.php, otterremo questo risultato.

Se in un secondo momento decidiamo che per il nostro sito è più adatto un rosso scuro, sarà sufficiente assegnarvi tale valore all'inizio dello script, rendendo così effettiva la modifica in tutto il codice, senza peraltro modificare la classe che potrebbe essere condivisa con altre applicazioni anche esterne al server.

Nell'esempio che segue, stavolta utilizzeremo il metodo statico "stampaColore()" per visualizzare i colori sul browser.

test.php

<?php

	require_once("Colore.php");

	Colore::stampaColore("rosso");

	Colore::$rosso = "#C11C1C"; // Rosso più scuro

	Colore::stampaColore("rosso");

?>

L'esempio soprastante genera questo risultato.

Per accedere ai membri statici dall'interno della classe, $this non è adeguato e genera il seguente errore :
Fatal error: Using $this when not in object context in C:\AppServ\www\test\Colore.php

Il modo corretto per accedervi dall'interno è mediante il costrutto self :

<?php

	class Colore
	{
		static $rosso = "#FF0000";

		// ...

		static public function stampaColore($colore)
		{
			self::$rosso = "#FF0000";

			echo "<font color=\"" . Colore::${$colore} . "\">Il valore esadecimale del colore $colore è : ";
			echo Colore::${$colore} . "</font><br />\n";
		}
	}

?>

Concludo il capitolo con una nota per chi è già avvezzo con il concetto dell'ereditarietà.
Se accedete a un membro statico della classe madre all'interno della figlia, ricordatevi di sostituire self con parent.